﻿namespace TradePublish.Common
{
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Text;
    using System.Text.RegularExpressions;
    using TradePublish.Entity;
    using Winista.Text.HtmlParser;

    internal class Utils
    {
        public static ArrayList GetEmail(string htmlCode)
        {
            if (htmlCode == null)
            {
                return new ArrayList();
            }
            int index = htmlCode.ToLower().IndexOf("<body");
            if (index > 0)
            {
                htmlCode = htmlCode.Substring(index);
            }
            htmlCode = ReplaceRegxString(htmlCode, @"<!--[\s\S]*?-->", "");
            Hashtable hashtable = new Hashtable();
            string pattern = @"[A-Za-z0-9]+([-+_.][A-Za-z0-9]+)*@[A-Za-z0-9]+([-.][A-Za-z0-9]+)*\.[A-Za-z0-9]+([-.][A-Za-z0-9]+)*";
            MatchCollection matchs = new Regex(pattern, RegexOptions.IgnoreCase).Matches(htmlCode);
            for (int i = 0; i <= (matchs.Count - 1); i++)
            {
                string key = matchs[i].ToString();
                if (!hashtable.ContainsKey(key))
                {
                    hashtable.Add(key, key);
                }
            }
            ArrayList list = new ArrayList();
            foreach (string str3 in hashtable.Keys)
            {
                list.Add(str3);
            }
            return list;
        }

        public static string getHostName(string url)
        {
            string pattern = @"http://[^\.]*\.(?<domain>[^/]*)";
            Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
            return regex.Match(url).Groups["domain"].Value;
        }

        public static ITag getTag(INode node)
        {
            if (node == null)
            {
                return null;
            }
            return ((node is ITag) ? (node as ITag) : null);
        }

        public static bool isTopDomain(string url)
        {
            string str = url;
            if (url.IndexOf("//") > 0)
            {
                str = url.Substring(url.IndexOf("//") + 2);
            }
            if ((str.IndexOf("/") <= 0) || (str.IndexOf("/") == (str.Length - 1)))
            {
                string[] strArray = ".com.cn .net.cn .org.cn .com .cn .net .cc .org .hk .info .name .biz .asia .me .tel .mobi .tw .in .gov.cn .tv .cm .cd .ph .us .ws .at .be .nl".Split(new char[] { ' ' });
                for (int i = 0; i < strArray.Length; i++)
                {
                    string str3 = str.Replace(strArray[i], "");
                    if (str3.Length < str.Length)
                    {
                        string[] strArray2 = str3.Split(new char[] { '.' });
                        return ((strArray2.Length == 1) || ((strArray2.Length == 2) && strArray2[0].ToLower().Equals("www")));
                    }
                }
            }
            return false;
        }

        public static string removeNum(string inStr)
        {
            for (int i = 0; i < 10; i++)
            {
                inStr = inStr.Replace(""+i, "");
            }
            return inStr;
        }

        public static string ReplaceRegxString(string sOld, string sRegexString, string sReplaceString)
        {
            Regex regex = new Regex(sRegexString, RegexOptions.Singleline | RegexOptions.IgnoreCase);
            return regex.Replace(sOld, sReplaceString);
        }

         /// <summary>
        /// 依次扫描每个字符.
        /// 图形不查
        /// 英文小于等于三个不查
        /// 英文和数字组合看做英文
        /// 数字不查
        /// </summary>
        /// <param name="tradeName"></param>
        /// <returns></returns>
        public static List<TradeNameSplit> splitTradeName(String tradeName)
        {
            string number = "0123456789";//数字
            string split = "; ；";//分隔符：中英文分号，空格
            string word = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//英文字母

            List<TradeNameSplit> rtn = new List<TradeNameSplit>();
            if (tradeName == null || tradeName.Equals("") )
            {
                return rtn;
            }
            #region 图形+数字  或   字头+数字 情况下
            else if (tradeName.IndexOf("图形") >= 0)
            {
                tradeName = tradeName.Replace("图形", "").Replace(";", "").Replace("；", "");
                Boolean isNum = true;
                for (int i = 0; i < tradeName.Length; i++)
                {
                    string c = tradeName.Substring(i, 1);
                    if (number.IndexOf(c) < 0)
                    {
                        isNum = false;
                    }
                }
                if (isNum && tradeName.Trim().Length > 0)
                {
                    TradeNameSplit t = new TradeNameSplit();
                    t.key = tradeName;
                    t.type = 1;//数字
                    rtn.Add(t);
                    return rtn;
                }
                else
                {
                    return rtn;
                }
            } 
            #endregion

            int charType = -1;//字符类型，-1分隔符,0-英文，1-数字，2-汉字 
            StringBuilder tmp = new StringBuilder(""); 
            
            for (int i = 0; i < tradeName.Length; i++)
            {
                string c=tradeName.Substring(i,1);
                if (split.IndexOf(c) >= 0)
                { 
                    #region 遇到分隔符
                    if (charType == 0 && c.Equals(" "))
                    {
                        //英文单词直接的空格，不算分割
                        tmp.Append(c);
                    }
                    else
                    { 
                        TradeNameSplit t = new TradeNameSplit(); 
                        t.key = tmp.ToString(); 
                        t.type = charType; 
                        rtn.Add(t); 
                        tmp = new StringBuilder(""); 
                        charType = -1;
                    } 
                    #endregion
                }
                else
                {
                    #region   不是分隔符，继续
                    tmp.Append(c);
                    if (charType == -1)
                    {    
                        #region 第一个字符，刚开始
                        if (word.IndexOf(c) >= 0)
                        {
                            charType = 0; //英文
                        }
                        else if (number.IndexOf(c) >= 0)
                        {
                            charType = 1; //英文
                        }
                        else
                        {
                            charType = 2; //汉字
                        }
                        #endregion
                    }
                    else if (charType == 0)
                    {
                        #region 原来是英文，不管本次是什么字符，均认为是英文在延续。
                        charType = 0; //英文
                        #endregion
                    }
                    else if (charType == 1)
                    {
                        #region 原来是数字，可能是上个字符是新分组的，或者已经连续好几个数字了。
                        if (word.IndexOf(c) >= 0)
                        {
                            #region 遇到英文，前面的数字去掉。
                            tmp = new StringBuilder();
                            charType = 0; //英文
                            #endregion
                        }
                        else if (number.IndexOf(c) >= 0)
                        {
                            #region 遇到数字，继续。
                            charType = 1; //数字
                            #endregion
                        }
                        else
                        {
                            #region 遇到汉字，前面的数字去掉。
                            tmp = new StringBuilder();
                            charType = 2; //汉字
                            #endregion
                        }
                        #endregion
                    }
                    else  
                    {
                        #region 原来是汉字
                        charType = 2; //依旧认为是汉字，后期再排查掉
                        #endregion
                    }
                    #endregion
                } 
            }  
                
            if (tmp != null && tmp.Length > 0)
            {
                TradeNameSplit t = new TradeNameSplit(); 
                t.key = tmp.ToString(); 
                t.type = charType; 
                rtn.Add(t);
            } 

            //最后需要将数字去除掉，除非是纯数字 
            if (rtn.Count == 1)
            {
                #region 只有一个分组情况下，若是全数字，则保留。
                if (rtn[0].type == 1)
                {
                    ;//纯数字
                }
                else
                {
                    #region 不是纯数字，可以删除数字，看看是否长度上超过3
                    String unNumStr = removeNum(rtn[0].key).Trim();
                    int numC = rtn[0].key.Length - unNumStr.Length;
                    int unNumC = unNumStr.Length;
                    if (numC > 0)
                    {
                        //有数字
                        if (unNumStr.Length ==1)
                        {
                            //字头+数字
                            rtn[0].key = rtn[0].key.Replace(unNumStr,"");
                            rtn[0].type = 1;//数字
                        }

                    }
                    else
                    {
                        //没有数字
                        if (rtn[0].type == 0 && rtn[0].key.Length <= 3)
                        {
                            #region  英文，移除数字后，个数小于3个
                            rtn = new List<TradeNameSplit>();
                            #endregion
                        }

                    } 
                    #endregion
                }
                #endregion
            }
            else
            {
                #region 移除全部数字
                for (int i = 0; i < rtn.Count;i++ )
                {
                    if (rtn[i].type == 1)
                    {
                        //数字，直接删除
                        rtn.RemoveAt(i);
                        i--;
                    }
                    else
                    {
                        #region 不是纯数字，可以删除数字，看看是否长度上超过3
                        rtn[i].key = removeNum(rtn[i].key).Trim();
                        if (rtn[i].type == 0 && rtn[i].key.Length <= 3)
                        {
                            #region  英文，移除数字后，个数小于3个
                            rtn.RemoveAt(i);
                            i--;
                            #endregion
                        }
                        #endregion 
                    } 
                }
                #endregion 
            } 
            return rtn;
        }



        public static string StripHTML(string strHtml)
        {
            string[] strArray = new string[] { "<script[^>]*?>.*?</script>", "<(\\/\\s*)?!?((\\w+:)?\\w+)(\\w+(\\s*=?\\s*(([\"'])(\\\\[\"'tbnr]|[^\\7])*?\\7|\\w+)|.{0})|\\s)*?(\\/\\s*)?>", @"([\r\n])[\s]+", "&(quot|#34);", "&(amp|#38);", "&(lt|#60);", "&(gt|#62);", "&(nbsp|#160);", "&(iexcl|#161);", "&(cent|#162);", "&(pound|#163);", "&(copy|#169);", @"&#(\d+);", "-->", @"<!--.*\n" };
            string[] strArray2 = new string[] { "", "", "", "\"", "&", "<", ">", " ", "\x00a1", "\x00a2", "\x00a3", "\x00a9", "", "\r\n", "" };
            string str = strArray[0];
            string input = strHtml;
            for (int i = 0; i < strArray.Length; i++)
            {
                input = new Regex(strArray[i], RegexOptions.IgnoreCase).Replace(input, strArray2[i]);
            }
            input.Replace("<", "");
            input.Replace(">", "");
            input.Replace("\r\n", "");
            return input;
        }
    }
}

